iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
自我挑戰組

資料分析及AI深度學習-簡單基礎實作系列 第 26

DAY26:判斷800字外為isnull的方法

  • 分享至 

  • xImage
  •  

組合模型判斷非800字內的字為isnull

  1. 獲得各模型預測字的機率表

    • 800字內
    • 800字外
    • 測試賽資料集
  2. 資料總筆數

    • 官方800字內:train資料集(174,808 )+test資料集(18,717張),合計193,525張圖檔。
    • 官方800字外:723張圖檔。
    • 測試賽樣本:90張圖檔。
  3. 程式碼

import torch
import torch.nn as nn
import os
from dataset import CaptchaData
from torchvision.transforms import Compose, ToTensor
import csv
import copy


data_path = r"C:\Users\Frank\PycharmProjects\practice\mountain\清洗標籤final\train_all"
img_names = os.listdir(data_path)
source = img_names
title = copy.deepcopy(source)
title.append('predict')
title.append('true')

f = open('./densenet201_in800_official_nomask.csv', 'a',newline='')
w = csv.writer(f)
w.writerow(title)
f.close()
alphabet = ''.join(source)

def predict(img_dir):
    n = 0
    m = 0
    transforms = Compose([ 
                           ToTensor()
                          ])
    dataset = CaptchaData(img_dir, transform=transforms)
    model = torch.load('./best_densenet201_8.pth')

    if torch.cuda.is_available():
        model = model.cuda()

    model.eval()

    for k, (img, target) in enumerate(dataset):
        img = img.view(1, 3 , 80 ,80 ).cuda()
        target = target.view(1, 1 * 800).cuda()
        output = model(img)

        output = output.view(-1, 800)
        target = target.view(-1, 800)
        output_prob = nn.functional.softmax(output, dim=1)
        output_prob_list = output_prob.cpu().detach().numpy().tolist()


        output = torch.argmax(output_prob, dim=1)

        target = torch.argmax(target, dim=1)
        output = output.view(-1, 1)[0]
        target = target.view(-1, 1)[0]


        print('pred: ' + ''.join([alphabet[i] for i in output.cpu().numpy()]))
        print('true: ' + ''.join([alphabet[i] for i in target.cpu().numpy()]))
        pred = ''.join([alphabet[i] for i in output.cpu().numpy()])
        true = ''.join([alphabet[i] for i in target.cpu().numpy()])
        if pred == true:
            n += 1
            output_prob_list[0].append(pred)
            output_prob_list[0].append(true)
            # output_prob_list[0].append(1)
            f = open('./densenet201_in800_official_nomask.csv', 'a',newline='')
            w = csv.writer(f)
            w.writerow(output_prob_list[0])
            f.close()
        else:
            m += 1
            output_prob_list[0].append(pred)
            output_prob_list[0].append(true)
            # output_prob_list[0].append(0)
            f = open('./densenet201_in800_official_nomask.csv', 'a',newline='')
            w = csv.writer(f)
            w.writerow(output_prob_list[0])
            f.close()

    print("pred_acc:", n / (n + m))
    print(m)
  1. 輸出的800字機率表

    圖片來源:https://ithelp.ithome.com.tw/articles/10277916

  2. 判斷方法

    • 選擇每個字的閾值

      • <方法一>單一中文字機率最小值
      • <方法二>單一中文字機率平均值
    • 任意選擇奇數個模型組合後,產生模型權重表與利用新模型權重得到的機率表。

      • <方法一>各模型中,單獨一個字的辨識準確度占比(如:官方800字內的「白」有100個樣本,正確辨識80個,「白」的辨識準確度就是80%)
      • <方法二>各模型中,單獨計算800個中文字機率占比(sofmax輸出機率)
    • 如何判斷isnull

      • <方法一>多模型投票,取多數者(故1.2選擇奇數個模型隨機組合)
      • <方法二>模型加權判斷
  3. 之後的作法可參考訓練模型-模型組合與辨識isnull(二)以及訓練模型-模型組合與辨識isnull(三)


今日小結

  • 因為同組的關係,我的隊友寫得又比我快比我好,我忍不住要來分享一下他的文,我們做法是這麼做的,在最後會來探討其他組別的作法。

  • 後面判斷完isnull就剩下上GCP架設API,供比賽的時候使用。


上一篇
DAY25:模型訓練DenseNet201
下一篇
DAY27:GCP架設VM
系列文
資料分析及AI深度學習-簡單基礎實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言